\section{Diseño de la solución}

\subsection{Primer enfoque: estrategias de deformación}

El primer enfoque se adoptó fue el de modelar por separado cada una de las estrategias para ocultar
los insultos. Se podría hacer que nuestro \textit{moderador} conociera varias de estas estrategias
de deformación. Dada una estrategia de deformación y un literal conocido, se podría obtener las
distintas deformaciones a buscar en el texto original.

El siguiente diagrama ilustra esta idea:

\begin{figure}[!h]
\centering
\includegraphics[scale=0.6]{./diagramas/enfoque1_seq.png}
\caption{primer enfoque, modelado de estrategias de deformación}
\end{figure}

Pronto nos dimos cuenta que esta idea era una sobre-simplificación del problema: había deformaciones
que no se podían expresar de esta forma. El caso más claro seguramente sea la repetición de letras:
tanto ``bobooo'' como ``bobooooo'' son una deformación similar, pero no es posible devolver todas
las deformaciones producto de esta estrategia.

Aparte de esto, no encontramos forma de definir la forma de identificar la combinación de las
distintas estrategias de deformación.

\subsection{Segundo enfoque: normalización de palabras}

Habiendo descartado la primer alternativa, se analizó la idea de evaluar la validez de un texto
palabra por palabra. La idea era identificar, para cada insulto, una versión \textit{normalizada}
del mismo (que era simplemente el insulto sin deformaciones, en marculino singular).

Para lidiar con los insultos disimulados, se pensó en aplicar una serie de transformaciones a cada
palabra, con el objetivo de normalizarla y compararla luego con uno de los literales conocidos.

Ejemplos de transformaciones podrían ser las siguientes:

\begin{itemize}
	\item Reemplazar números y otros caracteres especiales por letras
	\item Eliminar letras repetidas
	\item Reemplazar plurales por singulares
	\item Eliminar ciertos prefijos/sufijos conocidos
\end{itemize}

Como se ve a continuación, el moderador conocería todas las estrategias:

\begin{figure}[H]
\centering
\includegraphics[scale=0.5]{./diagramas/enfoque2_obj.png}
\caption{estado de los objetos al analizar una palabra del comentario.}
\end{figure}

El proceso de detección sería como sigue:

\begin{figure}[H]
\centering
\includegraphics[scale=0.6]{./diagramas/enfoque2_seq.png}
\caption{aplicación de transformaciones para obtener el insulto normalizado.}
\end{figure}

Se puede ver fácilmente que esta solución no tenía ninguno de los problemas de la anterior. En
primer lugar, no hacía falta generar todas las (potencialmente infinitas) deformaciones posibles.
Además, la combinación de estrategias de solucionaba con la composición de transformaciones una tras
otra.

El problema, en esta ocasión, surgía al intentar encontrar insultos partidos. En esta solución, al
evaluar una palabra no se tiene ninguna información del contexto de la misma, lo cual genera una
limitación importante: nunca podrían encontrarse insultos en comantarios como ``María TON TA''


\subsection{Enfoque elegido: secuencias fonéticas}

\subsubsection{Descripción de la solución}

Tras descartar las dos alternativas previas, se optó por un enfoque distinto. Se intentó captar la
noción de por qué uno interpreta estos insultos disimulados como ofrensivos. La idea que proponemos
es que, al leer un comentario, uno efectúa ciertas sustituciones que permiten formar una secuencia
pronunciable.

Supongamos, por ejemplo, que queremos entender por qué una persona interpreta el comentario ``Son
dos b01u2'' como ofensivo.

En el ejemplo anterior, por su similitud gráfica uno reemplaza el cero por una letra \textit{o}, y
el uno por una \textit{l}. A su vez, la pronunciación del símbolo \textit{2} evoca el sonido
``dos''. El resultado de estas sustituciones mentales hace que pensemos en la secuencia pronunciable
``boludos'', en la que fácilmente podemos identificar la raíz del insulto ``boludo''.

Siguiendo esta noción, debíamos encontrar la forma de modelar este tipo de sustituciones y obtener,
dado un comentario, todas las posibles secuencia derivables del mismo. Luego, el problema se reducía a
encontrar la raíz de alguno de los insultos conocidos en esa secuencia.

Notemos que \textit{a priori} no sabemos si estos reemplazos a realizar son correctos o no, pero
podemos asumir que si alguna aplicación de reemplazos dio como resultado una cadena con insulto
entonces el comentario debe ser rechazado.

Consideremos, por otra parte, el siguiente caso: ¿cuál es la diferencia estructural entre
``computación'' y ``superputona''? A falta de algún tipo de análisis semántico sobre el texto
procesado hay algunos casos que necesariamente deberán ser tratados como excepciones.

Una última observación es que, aquí el problema se reduce a configurar los reemplazos adecuados, y
ya no hace falta modelar por separado todas las estrategias de ocultar los insultos. Una
implementación correcta de esta solución (configurada adecuadamente) debería ser capaz de detectar
cualquiera de las estrategias conocidas.

\subsubsection{El modelo}

Para empezar, identificamos algunos conceptos importantes de nuestro dominio:
\begin{itemize}
	\item \textit{Insulto}: palaba a detectar, para la cual nos interesaba conocer la raíz y su forma
		  canónica (para identificarla).
	\item \textit{Criterio de insultos}: el criterio que indica qué palabras van a ser consideradas
		  insultos.
	\item \textit{Moderador}: el encargado de decidir si un comentario es aprobado o no, de acuerdo a
		  un criterio de insultos.
	\item \textit{Reemplazo}: una sustitución posible a realizar sobre un comentario. Consiste de un
		  texto a reemplazar y su reemplazo. Por ejemplo, ``2'' por ``dos''.
    \item \textit{Secuencia fonética}: se trata de aquellas secuencias pronunciables que se forman al
    	  producir una serie de reemplazos sobre un comentario.
\end{itemize}

En la figura ~\ref{fig:diagramaDeClases} (página ~\pageref{fig:diagramaDeClases}) se puede ver un
diagrama de clases del modelo completo, que refleja los conceptos descritos previamente. Como se ve,
el moderador cuenta con un criterio de insultos que indica cuáles son los insultos a buscar. Si bien
en esta primera iteración se implementó un criterio fijo, se ve cómo fácilmente se podría reemplazar
por otro criterio que extraiga los insultos de una base de datos o desde un archivo.

El moderador también conoce a un analizador fonético, que es quien sabe generar todas las posibles
secuencias fonéticas derivadas de un comentario. Cabe destacar que antes de efectuar los reemplazos
se utiliza una serie de preprocesadores, que se encargan de generar una secuencia fonética inicial
sobre la cual se aplican los reemplazos. Estos preprocesadores se encargan de transformaciones
básicas como borrado de espacios, o pasar todo el texto a minúsculas.

\begin{figure}[H]
\centering
\includegraphics[scale=0.52,angle=90]{./diagramas/clases.png}
\caption{diagrama de clases del modelo final.}
\label{fig:diagramaDeClases}
\end{figure}

Este sería un \textit{snapshot} de los objetos en estado de inactividad (sin procesar ningún
comentario):

\begin{figure}[H]
\centering
\includegraphics[scale=0.5]{./diagramas/objetos.png}
\caption{diagrama de objetos del modelo final.}
\label{fig:diagramaDeObjetos}
\end{figure}


También, se puede consultar la figura ~\ref{fig:diagramaDeSecuencia1} 
(página ~\pageref{fig:diagramaDeSecuencia1}) para ver el procesamiento entero de un comentario.

\subsubsection{Resultados obtenidos}

Los resultados de la implementación del modelo recién descrito fueron muy buenos: se pudo reconocer
efectivamente insultos en comentarios utilizando cualquiera de las estrategias conocidas para
ocultarlos. Tampoco se detectaron casos de faltos positivos que puedan causar el rechazo de
comentarios válidos.

Saliendo del alcance de este trabajo, probablemente una solución más correcta hubiese incluído
algún componente de aprendizaje automático, y cierto nivel de análisis semántico para no depender
de tanta configuración manual (sobre todo en lo que respecta a las excepciones).

Sin embargo, creemos que la solución implementada es una buena aproximación al proceso que realizamos
para identificar en los textos, y se construyó un modelo que lo refleja.

\begin{figure}[H]
\centering
\includegraphics[scale=0.55,angle=90]{./diagramas/seq-1.png}
\caption{evaluación del somentario ``sos un T0N T0''}
\label{fig:diagramaDeSecuencia1}
\end{figure}
